use crate::draw::Draw;

/// 使用特征对象的屏幕容器：可存放任意实现 Draw 的类型。
pub struct Screen {
    /// Vec 中元素统一为 Box<dyn Draw>，支持异构集合。
    pub components: Vec<Box<dyn Draw>>,
}

impl Screen {
    /// 逐个渲染组件；调用 draw 时发生动态分发。
    pub fn run(&self) {
        for component in &self.components {
            component.draw();
        }
    }
}

/// 使用泛型的屏幕容器：仅接受同一种实现 Draw 的类型。
pub struct GenericScreen<T: Draw> {
    /// Vec<T> 中的 T 在编译期确定，静态分发更高效。
    pub components: Vec<T>,
}

impl<T: Draw> GenericScreen<T> {
    /// 同样遍历渲染，但调用 draw 时采用静态分发（可内联、零开销）。
    pub fn run(&self) {
        for component in &self.components {
            component.draw();
        }
    }
}